package org.map.core {  
	
	import flash.display.DisplayObjectContainer;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.geom.Point;
	
	     public class IsoUtil {  
	
			     //区块的大小
			     public static var size:int
				 //长方菱形的列数	 
				 private static var cols:int
				 //长方菱形的行数	 
				 private static var rows:int
				 
				 //正方菱形的列数	 
				 private static var dcols:int
				 //正方菱形的行数	 
				 private static var drows:int
					 
				 public static function init(_cols:int,_rows:int,_size:int):void{
				 
					 size=_size
					 
					 cols=_cols
					 
					 rows=_rows
						 
					 dcols=getDiamondAreaByStaggered().x
				 
					 drows=getDiamondAreaByStaggered().y
						 
				 }
		
		         private static const Y_CORRECT:Number=Math.cos(- Math.PI/6)*Math.SQRT2;          
		
		         //public static const Y_CORRECT:Number = 1.2247448713915892;  
		
				 /**
				  * 把等角空间中的一个3D坐标点转换成屏幕上的2D坐标点   
				  * @param pos
				  * @return 
				  * 
				  */		         
		         public static function isoToScreen(pos:Point3D):Point2D {  
			
			             var screenX:Number=pos.x-pos.z;  
			
			             var screenY:Number=pos.y*Y_CORRECT+(pos.x+pos.z)*0.5;  
			
			             return new Point2D(screenX,screenY);  
						 
			
			         }  

				 /**
				  * 把屏幕上的2D坐标点转换成等角空间中的一个3D坐标点   
				  * @param point
				  * @return 
				  * 
				  */		         
		         public static function screenToIso(point:Point2D):Point3D {  
			
			             var xpos:Number=point.y+point.x*.5;  
			
			             var ypos:Number=0;  
			
			             var zpos:Number=point.y-point.x*.5;  
			
			             return new Point3D(xpos,ypos,zpos);  
			
			         }  
				 
				 /**
				  * 长方菱形坐标推导出正菱形的坐标
				  * @param cols 长方菱形的列数
				  * @param col  长方菱形列坐标
				  * @param row  长方菱形行坐标
				  * @return 
				  * 
				  */				 
				 public static function StaggeredToDiamond(col:int,row:int):Point2D{
					 
					 var x:int=int((row+1)/2)+col
					 var y:int=cols-1-col+int(row/2)
					 return new Point2D(x,y)
					 
				 }
				 
				 /**
				  * 正菱形坐标推导出长方菱形的坐标 
				  * @param cols 长方菱形的列数
				  * @param col  正菱形列坐标
				  * @param row  正菱形行坐标
				  * @return 
				  * 
				  */				 
				 public static function DiamondToStaggered(col:int,row:int):Point2D{
					 
					 var y:int=col+row-cols+1
					 var x:int=col-int((y+1)/2)
					 return new Point2D(x,y)
					 
				 }
				 
				 /**
				  * 由长方菱形位置数值推导出菱形的位置 
				  * @param pos
				  * @return 
				  * 
				  */				  			 
				 public static function posToPoint3D(pos:int):Point3D{
					 
					 var row:int=Math.floor(pos/cols)
					 var col:int=pos%cols
					 
					 var x:int=int((row+1)/2)+col
					 var y:int=cols-1-col+int(row/2) 
					 
					 return new Point3D(x*size,0,y*size)
					 
				 }
				 
				 
				 /**
				  * 由菱形位置推导出长方菱形的位置数值 
				  * @param pos
				  * @return 
				  * 
				  */				  			 
				 public static function point3DToPos(pos:Point3D):int{
					 
					 var col:int = Math.round(pos.x / size)
					 var row:int = Math.round(pos.z / size)
					  
					 var y:int=col+row-cols+1
					 var x:int=col-int((y+1)/2)
					 
					 return  x+y*cols
					 
				 }
				 
				 
				 /**
				  * 由菱形行列推导出长方菱形的位置数值 
				  * @param pos
				  * @return 
				  * 
				  */				  			 
				 public static function ColRowToPos(col:int,row:int):int{
					 
					 var y:int=col+row-cols+1
					 var x:int=col-int((y+1)/2)
					 
					 return  x+y*cols
					 
				 }
				 
				 
				 /**
				  * 创建地图 
				  * @param cols 地图列数
				  * @param rows 地图行数
				  * @param obj  
				  * @param world
				  * @param size
				  * 
				  */				 
				 public static function createMap(world:Sprite):void{
				     cols=30;rows=30;size=60;
					 dcols=getDiamondAreaByStaggered().x
					 
					 drows=getDiamondAreaByStaggered().y
					 for(var i:int = 0; i < cols; i++)
					 {
						 for(var j:int = 0; j < rows; j++)
						 {	
//							 var child:Shape = new Shape();
//							 child.graphics.clear();
//							 child.graphics.beginFill(0xFFCC00);
//							 child.graphics.lineStyle(0,0,.5);
//							 child.graphics.moveTo(- size+300,0+300);
//							 child.graphics.lineTo(0+300,- size*.5+300);
//							 child.graphics.lineTo(size+300,0+300);
//							 child.graphics.lineTo(0+300,size*.5+300);
//							 child.graphics.lineTo(- size+300,0+300);
//							 world.addChild(child);
							 
							 var tile:IsoTile = new IsoTile(0xFFCC00,0,size)
							 tile.position = new Point3D(Number(i * size), Number(0), Number(j * size));
							 world.addChild(tile);
						 }
					 }

				 }
				 
				 /**
				  * 获取地图物品的占格坐标集合 [Point2D,Point2D]
				  * @param vo :IsoVO  地图物品的属性对象
				  * @return 
				  * 
				  */				 
				 public static function getIsoObjectTiles(col:int,row:int,cols:int,rows:int):Array{
					 
					 var points:Array=[]
						 
					 for(var i:int=0;i<cols;i++){
						 
						 for(var j:int=0;j<rows;j++){
							 
							 points.push(new Point2D(col+i,row+j))
							 
						 }
						 
					 }
					 
					 return points
 
				 }
				 
				 
				 /**
				  * 正菱形投影区块的坐标 转化 为位置数值 如 10,234
				  * @param pos:Point3D
				  * @return 
				  * 
				  */				 
				 public static function point3DToPos3D(pos:Point3D):int{
					 
					 //var area:Point2D = getDiamondAreaByStaggered()
						 
					 var x:int=cols+int(rows/2)
					 var y:int=cols+int((rows-1)/2) 
						  
					 //var p:Point2D=point3DToColRow(pos)
						 
					 var col:int = Math.round(pos.x / size)
					 var row:int = Math.round(pos.z / size)
						 
					 row*=x
						 
					 return col+row
					
					 
				 }
				 
				 /**
				  * 正菱形 行列号 装换为 为位置数值 如 10,234
				  * @param col 区块列
				  * @param row 区块行
				  * @return 
				  * 
				  */				 
				 public static function colRowToPos3D(col:int,row:int):int{

					 var x:int=cols+int(rows/2)
					 var y:int=cols+int((rows-1)/2)
						 
					 return row*x+col
					 
				 }
				 
				 /**
				  * 正菱形 行列号 装换为 投影区块坐标
				  * @param world 地图容器
				  * @param size  区块尺寸
				  * @return 
				  * 
				  */				 
				 public static function colRowToPoint3D(col:int,row:int):Point3D{
					 
					 var pos:Point3D=new Point3D(col*size,0,row*size)

					 return pos
					 
				 }
				 
				 /**
				  * 正菱形 行列号 装换为 唯一数值
				  * @param world 地图容器
				  * @param size  区块尺寸
				  * @return 
				  * 
				  */				 
				 public static function colRowToNum(col:int,row:int):int{
					 
					 return row*dcols+col
					 
					
				 }
				 
				 /**
				  * 正菱形投影区块坐标 装换为 行列号
				  * @param world 地图容器
				  * @param size  区块尺寸
				  * @return 
				  * 
				  */				 
				 public static function point3DToColRow(point:Point3D):Point2D{
					 
					 var col:int = Math.round(point.x / size)
					 var row:int = Math.round(point.z / size)
					 return new Point2D(col,row)
					 
				 }
				 	
				 /**
				  * 获取正菱形鼠标点击位置的投影区块坐标  
				  * @param world 地图容器
				  * @param size  区块尺寸
				  * @return 
				  * 
				  */				 
				 public static function getMouseDownPos3D(world:Sprite):Point3D{
					 
					 var pos:Point3D = screenToIso(new Point2D(world.mouseX, world.mouseY));
				     pos.x = Math.round(pos.x / size) * size;
				     pos.y = Math.round(pos.y / size) * size;
				     pos.z = Math.round(pos.z / size) * size;
					 return pos

				 }
				 
				 
				 /**
				  * 从IsoObject对象的屏幕坐标 转换 地图坐标
				  * @param mouseX
				  * @param mouseY
				  * @return 
				  * 
				  */				 				 
				 public static function getPos2DByIsoPos(isoX:Number,isoY:Number):Point2D{
					 
					 var pos:Point3D = screenToIso(new Point2D(isoX, isoY));
					 pos.x = Math.round(pos.x / size) ;
					 pos.z = Math.round(pos.z / size) ;
					 return new Point2D(pos.x,pos.z)
					 
				 }
				 
				 /**
				  * 获取正菱形鼠标点击位置的投影区块行列号
				  * @param world 地图容器
				  * @param size  区块尺寸
				  * @return 
				  * 
				  */				 
				 public static function getMouseDownPos2D(world:Sprite):Point2D{
					 
					 var pos:Point3D = screenToIso(new Point2D(world.mouseX, world.mouseY));
					 pos.x = Math.round(pos.x / size) ;
					 pos.z = Math.round(pos.z / size) ;
					 return new Point2D(pos.x,pos.z)
					 
				 }
				 
				 /**
				  * 获取正菱形投影区域的行列 
				  * @param pos 投影位置
				  * @param size 区块尺寸
				  * @return 
				  * 
				  */				 
				 public static function getDiamondColRow(pos:Point3D):Point2D{
					 
					 return new Point2D(pos.x/size,pos.z/size)
				 
				 }
				 
				 /**
				  * 由长方菱形列数推导出正菱形的行列数,转换地图时候使用
				  * @return 
				  * 
				  */				 
				 public static function getDiamondAreaByStaggered():Point2D{
				 
					 var x:int=cols+int(rows/2)
					 var y:int=cols+int((rows-1)/2)
					 return new Point2D(x,y)
				 
				 }
				 
				 /**
				  * 设置长方菱形的原点坐标 后 正菱形的 原点坐标
				  * @return 
				  * 
				  */				 
				 public static  function getDiamondOrigin():Point2D{
					 
				 //投影区域原点坐标
				 var dPos2D:Point2D=IsoUtil.isoToScreen(new Point3D(0,0,0))
				 
				 //长方菱形原点坐标
				 var sPos2D:Point2D=IsoUtil.isoToScreen(IsoUtil.posToPoint3D(0))
				 
				 dPos2D.x-=sPos2D.x
				 
				 dPos2D.y-=sPos2D.y
					 
				 return dPos2D
                 
				 }
		
		     }  
	
	 } 

